#ifndef __INF_LCD_H__
#define __INF_LCD_H__

#include "fsmc.h"

/* LCD 分辨率320*480
------------------>(x)
|              |
|              |
|              |
|              |
|              |
|              |
|              |
|              |
|===============
|
V (y)
 */
#define DISPLAY_W 320
#define DISPLAY_H 480
#define SRAM_BANK4 0x6C000000
#define LCD_ADDR_CMD (uint16_t *)SRAM_BANK4
#define LCD_ADDR_DATA (uint16_t *)(SRAM_BANK4 + (1 << 11))

/* 常见颜色 */
#define WHITE 0xFFFF
#define BLACK 0x0000
#define BLUE 0x001F
#define BRED 0XF81F
#define GRED 0XFFE0
#define GBLUE 0X07FF
#define RED 0xF800
#define MAGENTA 0xF81F
#define GREEN 0x07E0
#define CYAN 0x7FFF
#define YELLOW 0xFFE0
#define BROWN 0XBC40 // 棕色
#define BRRED 0XFC07 // 棕红色
#define GRAY 0X8430  // 灰色

void Inf_LCD_Init(void);

/// @brief 清屏为纯色
/// @param 颜色
void Inf_LCD_ClearAll(uint16_t color);

/// @brief 在指定行和列开始显示字符
/// @param y 显示字符的起始行
/// @param x 显示字符的起始列
/// @param c 字符
/// @param width 字体的宽度 可选6/8/12/16
/// @param fontColor 字体的颜色
/// @param backColor 背景颜色
void Inf_LCD_ShowChar(uint16_t y,uint16_t x,uint8_t c,uint16_t width,uint16_t fontColor,uint16_t backColor);

/// @brief 显示字符串
/// @param y 字符串显示开始行号
/// @param x 字符串显示开始列号
/// @param str 带显示字符串
/// @param len 字符串中字符个数
/// @param width 字体宽度
/// @param fontColor 字体颜色
/// @param backColor 背景色
void Inf_LCD_ShowString(uint16_t y,uint16_t x,uint8_t *str,uint16_t len,uint16_t width,uint16_t fontColor,uint16_t backColor);

/// @brief 显示一个汉字
/// @param y 起始行
/// @param x 起始列
/// @param index 中文字模在数组中角标
/// @param fontColor 字体颜色
/// @param backColor 背景颜色
void Inf_LCD_ShowChineseChar(uint16_t y,uint16_t x,uint8_t index, uint16_t fontColor, uint16_t backColor);


/// @brief 显示一句话
/// @param y 
/// @param x 
/// @param index 
/// @param len 长度
/// @param fontColor 
/// @param backColor 
void Inf_LCD_ShowChineseString(uint16_t y,uint16_t x,uint8_t index,uint8_t len, uint16_t fontColor, uint16_t backColor);

/// @brief 显示一张图片
/// @param  
void Inf_LCD_ShowImg(void);

/**
 * @brief 画点
 * 
 * @param y 点的所在行号
 * @param x 点的所在列号
 * @param width 点的大小
 * @param color 点的颜色
 */
void Inf_LCD_DrawPoint(uint16_t y,uint16_t x,uint16_t width, uint16_t color);
/**
 * @brief 画线
 * 
 * @param x1 点1的横坐标
 * @param y1 点1的纵坐标
 * @param x2 点2的横坐标
 * @param y2 点2的纵坐标
 * @param width 线宽
 * @param color 线的颜色
 */
void Inf_LCD_DrawLine( uint16_t x1, uint16_t y1, uint16_t x2,uint16_t y2, uint16_t width, uint16_t color );

/**
 * @brief 画矩形
 * 
 * @param x1 矩形左上角点横坐标
 * @param y1 矩形左上角点纵坐标
 * @param x2 矩形右下角横坐标
 * @param y2 矩形右下角纵坐标
 * @param width 矩形线宽
 * @param color 矩形线的颜色
 */
void Inf_LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2,uint16_t y2, uint16_t width, uint16_t color);
/**
 * @brief 画空心圆
 * 
 * @param x 圆心x
 * @param y 圆心y
 * @param r 半径
 * @param width 线宽
 * @param color 线颜色
 */
void Inf_LCD_DrawRound(uint16_t x,uint16_t y, uint8_t r,uint16_t width, uint16_t color);

/**
 * @brief 画实心圆
 * 
 * @param x 圆心x
 * @param y 圆心y
 * @param r 半径
 * @param width 线宽
 * @param color 线颜色
 */
void Inf_LCD_DrawSolidCircle(uint16_t x,uint16_t y, uint8_t r,uint16_t width, uint16_t color);

#endif /* __INF_LCD_H__ */
